#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include "unordered_set"
#include   "queue"
#include "algorithm"
#include "queue"

using namespace std;
/*输入：events = [[1,2],[2,3],[3,4]]
输出：3
解释：你可以参加所有的三个会议。
安排会议的一种方案如上图。
第 1 天参加第一个会议。
第 2 天参加第二个会议。
第 3 天参加第三个会议。
示例 2：

输入：events= [[1,2],[2,3],[3,4],[1,2]]
输出：4*/

//int maxEvents(vector<vector<int>>& events) {
//
//    sort(events.begin(), events.end(),[](auto &a,auto &b){
//
//        return (a[1]-a[0])<=(b[1]-b[0]);
//
//    });
//    unordered_set<string> st;
//    int count=0;
//    for (int i = 0; i <events.size() ; ++i) {
//        string temp= to_string(events[i][0])+ to_string(events[i][1]);
//        if (st.find(temp)==st.end())
//        {
//            st.insert(temp);
//            count++;
//        }
//
//    }
//
//
//    return  count;
//}
//TODO 为什么没写对 首先题的意思就理解错了
//[[1,2],[2,3],[3,4],[1,2]] 这个代表可以 1 2 天完成 从第一天开始数
// 贪心思想是优先参加先结束的会议
// 1 这个题我是想到优先队列的事了 但是妈蛋不会写
//2 贪心思想 优先参加先结束的会议  所以我觉得还得按照结束时间排序
//3 如果 当天的day>=开始 && day<=结束 就加入队列
// 4如果 判断队列是不是有过期的事件 结束时间<当前时间 就移除
//5 选择第一个元素 ++
// 12 12  34 35 36 28
// 12 12  34 35 36 28
//
//11 22 14 34 44
//int maxEvents(vector<vector<int>>& events)
//{
//
//    sort(events.begin(), events.end(),[](auto a,auto b){
//        return a[1]<b[1];
//    });
//
//   // unordered_set<string > st;
//   // priority_queue<vector<int>,> q;
//    int i=0;//从第一天开始
//    int day=1;
//    int count=0;
//    while (i<events.size())
//    {
//
//        if(events[i][1]>=day&&day>=events[i][0])
//        {
//                count++;
//                day++;
//                events.erase(events.begin()+i);
//            continue;
//        }else if(events[i][1]>day){
//
//            events.erase(events.begin()+i);
//        }
//        i++;
//        day++;
//
//    }
//
//
//
//    return count;
//
//
//}
//说真的我是一头蠢猪
struct compare {
    bool operator()(const pair<int, int> &a, const pair<int, int> &b) {
        return a.second > b.second;//greater
    }
};

int maxEvents(vector<vector<int>> &events) {

    sort(events.begin(), events.end(), [](auto &a, auto &b) {
        return a[0] < b[0];
    });
    priority_queue<pair<int, int>, vector<pair<int, int>>, compare> q;

    int i = 0;
    int day = 1;
    int count = 0;
    while (i < events.size() || !q.empty()) {
        //这个队列应该维护当天可以塞入的吧
        while (i < events.size() && events[i][0] <= day && events[i][1] >= day) {
            q.push(make_pair(events[i][0], events[i][1]));
            i++;
        }

        while (!q.empty() && q.top().second < day) {
            q.pop();
        }

        if (!q.empty()) {
            q.pop();
            count++;
        }

        day++;

    }


    return count;

}